package com.symaster.common.clipper;


public interface Clipper {

    /**
     * 裁剪类型
     */
    enum ClipType {
        INTERSECTION,   // 交集，AND (intersection) ：主体和裁剪多边形相交的区域。
        UNION,          // 并集，OR (union) - 主体和裁剪多边形两者合并的区域。
        DIFFERENCE,     // 非/差，NOT (difference) - 裁剪多边形以外主体的区域。
        XOR             // 异或，XOR (exclusive or) - 主体和裁剪多边形两者相交以外的区域。
    }

    enum Direction {
        RIGHT_TO_LEFT, LEFT_TO_RIGHT
    }

    /**
     * 闭合类型
     */
    enum EndType {
        CLOSED_POLYGON, // 末端根据JoinType的值连接，填充路径使用多边形。
        CLOSED_LINE,    // 末端根据JoinType的值连接，填充路径使用多线段。
        OPEN_BUTT,      // 末端为直角，且没有延伸。
        OPEN_SQUARE,    // 末端为直角，并且向路径外延伸一部分。
        OPEN_ROUND      // 末端为圆角，并且向路径外延伸一部分。
    }

    /**
     * 连接类型
     */
    enum JoinType {
        SQUARE, // 矩形衔接。将所有斜边角进行倒角 C1×delta 。
        ROUND,  // 圆弧衔接。将所有斜边角进行到圆角处理。我们知道圆角其实是由倒角近似形成的，所以Clipper库引入ClipperOffset.ArcTolerance 属性（圆弧精度）指定了近似处理弧线时可接受的最大不精确性(“公差”)。
        MITER   // 斜角衔接。对一些窄角度，向外偏置可能会产生非常长的“尖峰”。
    }

    /**
     * 填充规则（fill rule）
     * 用于判断在封闭图形中，哪些区域是内部，哪些区域是外部（如’孔‘）
     */
    enum PolyFillType {
        EVEN_ODD, // 奇偶填充 : 奇数子区域填充，偶数子区域不填充。
        NON_ZERO, // 非零填充：所有绕数非零的区域都填充。
        POSITIVE, // 正填充：所有绕数 >0的区域都填充。
        NEGATIVE  // 负填充：所有绕数 < 0的区域都填充。
    }

    enum PolyType {
        SUBJECT,    // 主体多边形(ptSubject )：被裁剪多边形，也就是主体多边形。
        CLIP        // 裁剪多边形(ptClip )：裁剪多边形，使用此多边形裁剪主体多边形。
    }

    interface ZFillCallback {
        void zFill(Point.LongPoint bot1, Point.LongPoint top1, Point.LongPoint bot2, Point.LongPoint top2, Point.LongPoint pt);
    }

    // InitOptions that can be passed to the constructor ...
    int REVERSE_SOLUTION = 1;

    int STRICTLY_SIMPLE = 2;

    int PRESERVE_COLINEAR = 4;

    boolean addPath(Path pg, PolyType polyType, boolean Closed);

    boolean addPaths(Paths ppg, PolyType polyType, boolean closed);

    void clear();

    boolean execute(ClipType clipType, Paths solution);

    /**
     * @param clipType     裁剪操作的类型
     * @param solution     返回值
     * @param subjFillType 主体路径的填充规则
     * @param clipFillType 剪辑路径的填充规则
     */
    boolean execute(ClipType clipType, Paths solution, PolyFillType subjFillType, PolyFillType clipFillType);

    boolean execute(ClipType clipType, PolyTree polytree);

    boolean execute(ClipType clipType, PolyTree polytree, PolyFillType subjFillType, PolyFillType clipFillType);
}
